package com.yyoo.doc.html.builder;

import com.yyoo.doc.html.sax.SaxHtmlElement;
import com.yyoo.doc.html.style.StyleAttr;
import com.yyoo.doc.mypdf.MyPdfException;
import lombok.Data;

import java.awt.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zzy
 *
 * 将 html 样式属性转换为 pdf 相关属性
 */
@Data
public abstract class StyleBuilder {

    /**
     * 当前要解析的 html 元素对象
     */
    private SaxHtmlElement htmlEl;

    /**
     * 当前 tag 的样式属性键值对
     */
    private Map<String, String> styleMap = new HashMap<>();

    /**
     * 将 style 属性值转换为 Integer 对象
     * @param styleKey style 属性名
     * @return Integer 类型的对象
     */
    protected Integer converToInteger(String styleKey){
        if(StyleAttr.FONT_STYLE_CONVERTER.support(styleKey)){
            return StyleAttr.FONT_STYLE_CONVERTER.convert(styleKey,styleMap.get(styleKey));
        }else if(StyleAttr.ALIGN_CONVERTER.support(styleKey)){
            return StyleAttr.ALIGN_CONVERTER.convert(styleKey,styleMap.get(styleKey));
        }
        throw new MyPdfException("样式值 " + styleKey +" 不支持转换为 Integer");
    }

    /**
     * 将 style 属性值转换为 Float 对象
     * @param styleKey style 属性名
     * @return Integer 类型的对象
     */
    protected Float converToFloat(String styleKey){
        if(StyleAttr.SIZE_CONVERTER.support(styleKey)) {
            return StyleAttr.SIZE_CONVERTER.convert(styleKey, styleMap.get(styleKey));
        }

        throw new MyPdfException("样式值 " + styleKey +" 不支持转换为 Float");
    }

    /**
     * 将 style 属性值转换为 Color 对象
     * @param styleKey style 属性名
     * @return Color 类型的对象
     */
    protected Color converToColor(String styleKey){
        if(StyleAttr.COLOR_CONVERTER.support(styleKey)) {
            return StyleAttr.COLOR_CONVERTER.convert(styleKey, styleMap.get(styleKey));
        }

        throw new MyPdfException("样式值 " + styleKey +" 不支持转换为 Color");
    }

    /**
     * 将样式转换为 Integer 列表
     * @param styleKey 样式名称
     * @return 对应样式的int列表值
     */
    protected List<Integer> converToListInteger(String styleKey){
        if(StyleAttr.ARRAY_SIZE_CONVERTER.support(styleKey)) {
            return StyleAttr.ARRAY_SIZE_CONVERTER.convert(styleKey, styleMap.get(styleKey));
        }

        throw new MyPdfException("样式值 " + styleKey +" 不支持转换为 List<Integer>");
    }

    /**
     * 获取文本对齐方式值
     */
    protected Integer getTextAlign(){
        return converToInteger(StyleAttr.TEXT_ALIGN);
    }

    /**
     * 获取 horizontal-align 属性值
     * @return 水平对齐方式
     */
    protected Integer getHorizontalAlignment(){
        return converToInteger(StyleAttr.HORIZONTAL_ALIGN);
    }

    /**
     * 获取 vertical-align 属性值
     * @return 垂直对齐方式
     */
    protected Integer getVerticalAlignment(){
        return converToInteger(StyleAttr.VERTICAL_ALIGN);
    }

    /**
     * 获取 width 属性值
     */
    protected Float getWidth(){
        return converToFloat(StyleAttr.WIDTH);
    }

    /**
     * 获取 height 属性
     */
    protected Float getHeight(){
        return converToFloat(StyleAttr.HEIGHT);
    }

}
